/**
 * 
 */
var F = F || {};

/**
 * 定义模块方法(理论上，模块方法应放在闭包中实现,可以隐蔽内部信息)
 * @param {*} str 模块路由
 * @param {*} fn 模块方法
 */
F.define = function(str, fn) {
    var parts = str.split('.'),//解析模块路由
        old = parent = this,//old当前模块的祖父模块，parent当前模块父模块
        i = len = 0;//i模块层级，len模块层级长度
    //如果第一个模式是模块管理器单体对象，则移除
    if (parts[0] === 'F') {
        parts = parts.slice(1);
    }
    // 屏蔽对define与module模块方法的重写
    if (parts[0] === 'define' || parts[0] === 'module') return;
    // 遍历路由模块并定义每层模块
    for (len = parts.length; i < len; i++) {
        // 如果父模块中不存在当前模块
        if (typeof parent[parts[i]] === 'undefined') {
            // 声明当前模块
            parent[parts[i]] = {};
        }
        // 缓存下一层级的祖父模块
        old = parent;
        // 缓存下一层级父模块
        parent = parent[parts[i]];
    }
    if(fn) {//如果给定模块方法则定义该模块方法
        old[parts[--i]] = fn();//此时i等于parts.length，故减一
    }
    // 返回模块管理器单体对象
    return this;
}

F.define('string', function() {
    return {
        trim: function(str) {
            return str.replace(/^\s+|\s+$/g, '');
        }
    };
});

var result = F.string.trim('测试用例。');

F.define('dom', function() {
    var $ = function(id) {
        $.dom = document.getElementById(id);
        return $;
    }
    $.html = function(html) {
        if (html) {
            this.dom.innerHTML = html;
            return this;
        } else {
            return this.dom.innerHTML;
        }
    }
    return $;
});

F.dom('test').html();

F.define('dom.addClass');
F.dom.addClass = function(type, fn) {
    return function(className) {
        if (!~this.dom.className.indexOf(className)) {
            this.dom.className += ' ' + className;
        }
    }
}();

F.dom('test').addClass('test');

F.module = function() {
    var args = [].slice.call(arguments),
        fn = args.pop(),
        parts = args[0] && args[0] instanceof Array ? args[0] : args,
        modules = [],
        modIds = '',
        i = 0,
        ilen = parts.length,
        parent, j, jlen;
    while(i < len){
        if (typeof parts[i] === 'string') {
            parent = this;
            modIds = parts[i].replace(/^F\./, '').split('.');
            for(j = 0, jlen = modIds.length; j < jlen; j++) {
                parent = parent[modIds[j]] || false;
            }
            modules.push(parent);
        } else {
            modules.push(parts[i]);
        }
        i++;
    }
    fn.apply(null, modules);
}

F.module(['dom', document], function(dom, doc) {
    dom('test').html('new add!');
    doc.body.style.background = 'red';
});

F.module('dom', 'string.trim', function(dom, trim) {
    var html = dom('test').html();
    var str = trim(html);
    console.log('*' + html + '*', '*' + str + '*');
});

console.log(999, F);
